#include <stdio.h>
#include <stdlib.h>
#define __USE_GNU
#include <unistd.h>
#include <errno.h>
#include <color.h>
#include <string.h>


int checkdir(char *); //Controlla la cartella da cui è stato lanciato il programma 1=OK, 2=NO
int slashnum(char *,char); //Restituisce il numero di volte n cui un carattere appare in una stringa
int nofchr(char *, char);

//Stampa l'usage
void usage()
{
  printf("%sUsage:\n\t./build-chroot <dir> <mode>%s \n",C_YLW,C_END);
}

int main(int argc, char *argv[])
{
  const char * shell;
  char *cdir=get_current_dir_name();
  if(argc < 2) { 
    usage();
    exit(-1);
  }
  
//L'utente deve essere root!
  if (getuid() != 0) {
    printf("%sYou must be root to build che chroot!%s\n",C_RED,C_END);
    exit(-1);
  }
  
  if(chroot(argv[1])) {
    printf("%sImpossibile eseguire il chroot su %s : %s.%s\n",C_RED,argv[1],(char *)strerror(errno),C_END);
    exit(EXIT_FAILURE);
  }
  printf("%schroot eseguito con successo su %s.%s\n",C_GRN,argv[1],C_END);
  
  if (checkdir(argv[0]) && argv[1][0]== '/'){
    int i;   	
	char *directory=(char *)malloc(strlen(argv[1]) + nofchr(cdir,'/')*3); 
	for (i=1;i<=nofchr(cdir,'/');i++)
    		strcat(directory,"../"); //Per ogni cartella che separa l'attuale dalla root aggiungo un ../
	strcat(directory,++argv[1]); //E aggiungo la path a partire dalla root..ovviamente senza la prima /
    	if (chdir(directory)!=0){ //Effettuo il chdir
    		printf("%sImpossibile spostarsi su %s : %s.%s\n",C_RED,--argv[1],(char *)strerror(errno),C_END);
    		exit(EXIT_FAILURE);
    	}
    	free(directory);
  } else {
		printf ("%sAttenzione: devi lanciare il programma da /usr/bin. Hai usato il makefile e inserito la path completa alla cartella?%s\n",C_RED,C_END);
  		exit(EXIT_FAILURE);
  }
  printf("%scambio la directory corrente a %s...%s\n",C_BLU,argv[1],C_END);

  if((shell = getenv("SHELL")) == NULL)
	shell = "/bin/bash";
  printf("%sImposto la variabile SHELL a %s...%s\n",C_BLU,shell,C_END);
  execl(shell, shell, NULL);
  execl(shell, "env-update", NULL);
  return 0;
}
  
 /*Controlla che il programma sia avviato da /usr/bin
  *Restituisce 1 in caso di successo, 0 in caso di fallimento
  */  
int checkdir(char *argv0)
{
	if(argv0[0] == '.' && argv0[1] == '/')
		return 0;
	else if(strcmp(argv0,"build-chroot")==0)
		return 1;
	return 0;
}

/*Restituisce il numero di volte in cui uno stesso carattere compare in una stringa.
 */
int nofchr(char *string, char chr)
{
	int n=0,i;
	for(i=0;i<strlen(string);i++){
		if(string[i]==chr)
			n++;
	}
	return n;
}
